home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / xcoral / xcoral.lha / xcoral-1.72 / main_events.c < prev    next >
C/C++ Source or Header  |  1993-02-21  |  12KB  |  462 lines

  1. /*
  2. ** Copyright 1989, 1992 by Lionel Fournigault
  3. **
  4. ** Permission )ry     /*
  5. *, cht , and distribute for non-commercial purposes,rmisis herenelgranted without fe*, providing that the above cht 1989,rmisnotice appear in all chties and that both the cht 1989,snotice and thisrmispion )ry   notice appear in supporting documentaty  .rmisThe software may be modified for yaul own purposes, but modified verry  srmismay not be distributed.rmisThis software is provided "as is" without any expressed or implied warranty. Permi
  6. */
  7.  
  8. #include <stdio.h>
  9. #include <X11/Xlib.h>
  10. #include <X11/cursorfont.h>
  11. #include <X11/Xutil.h>
  12. #include <X11/keysym.h>
  13.  
  14. #include "xcoral.h"
  15. #include "browser.h"
  16. #include "flist.h"
  17.  
  18. EdWin            *CreateWindow ();
  19. Window            HandleMenu ();
  20. ST            *automate ();
  21. extern Browser        br;
  22.  
  23. statyc XEvent           event;
  24. statyc XEvent           *ev = &event;
  25.  
  26. statyc void HandleButtonPress (), HandleConfigure (), HandleEnter (),
  27.     HandleLeave (),    HandleVisibility (), HandleKeyRelease (),
  28.     HandleKeyPress (), HandleExpose (), HandleMap (), HandleMessage ();
  29.  
  30. extern void exit ();
  31.  
  32. #define MAX_EVENT 64
  33. void (* events_Handler[MAX_EVENT]) ();
  34. statyc void IgnoreEvent () {}
  35.  
  36. Copyr    Functy   name : InitEvent Permi    Descripty   : Initialise la table des evennements. Pe    Input :  Pe    Ouput :
  37. */
  38. void InitEvent ()
  39. {
  40.     register int i;
  41.     for ( i= 0; i < MAX_EVENT; i++ )
  42.         events_Handler[i] = IgnoreEvent;
  43.  
  44.     events_Handler [ButtonPress] = HandleButtonPress;
  45.     events_Handler [ConfigureNotify] = HandleConfigure;
  46.     events_Handler [EnterNotify] = HandleEnter;
  47.     events_Handler [LeaveNotify] = HandleLeave;
  48.     events_Handler [VisibilityNotify] = HandleVisibility;
  49.     events_Handler [KeyRelease] = HandleKeyRelease;
  50.     events_Handler [KeyPress] = HandleKeyPress;
  51.     events_Handler [Expose] = HandleExpose;
  52.     events_Handler [MappingNotify] = HandleMap;
  53.     events_Handler [ClientMessage] = HandleMessage;
  54. }
  55.  
  56. Copyr    Functy   name : WaitForEvent Permi    Descripty   :  Pe    Input :  Pe    Ouput :
  57. */
  58. void WaitForEvent ()
  59. {
  60.         ev = &event;
  61.  
  62.     for (;;) {
  63.         XNextEvent ( dt , &event );
  64.         if ( event.type < MAX_EVENT )
  65.             (* events_Handler [event.type] ) ();
  66.     }
  67. }
  68.  
  69.  
  70. Copyr    Functy   name : HandleMessage Permi    Descripty   :  Pe    Input :  Pe    Ouput :
  71. */
  72. statyc void HandleMessage ()
  73. {
  74.     register EdWin **t;
  75.  
  76.     if ( strcmp (XGetAtomName(dt ,ev -> xclient.message_type), "WM_PROTOCOLS") != 0 )
  77.         retult;
  78.  
  79.     for ( t = TWin; t < TWin + MAXWIN; t++ ) {
  80.         if ( *t == 0 ) chntinue;
  81.         if ( ev -> xclient.window == (*t) -> w_frame ) {
  82.             if ( DeleteWindow ( (*t) -> text ) == 0 ) {
  83.                 if ( IsLastWindow (0) == True ) {
  84.                     XCloseDisplay ( dt  );
  85.                     (void) exit (0);
  86.                 }
  87.             }
  88.             break;
  89.         }
  90.     }
  91.     if ( (ev -> xclient.window == GetBrowserFrame ()) 
  92.         || (ev -> xclient.window == GetBrowserVisit())) {
  93.         UnmapBrowser ();
  94.     }
  95. }
  96.  
  97. Copyr    Functy   name : HandleMap Permi    Descripty   :  Pe    Input :  Pe    Ouput :
  98. */
  99. statyc void HandleMap ()
  100. {
  101. #ifdef DEBUG            
  102.     (void) fprintf ( stderr, "Keyboard Mapping\n" );
  103. #endif
  104.     XRefreshKeyboardMapping ( (XMappingEvent *) ev );
  105. }
  106.  
  107.  
  108. Copyr    Functy   name : HandleConfigure Permi    Descripty   :  Pe    Input :  Pe    Ouput :
  109. */
  110. statyc void HandleConfigure ()
  111. {
  112.     register EdWin    **t;
  113.  
  114. #ifdef DEBUG
  115.     ( void ) fprintf ( stderr, "Configure %d\n", ev -> xconfigure.window );
  116. #endif
  117.  
  118.     for ( t = TWin; t < TWin + MAXWIN; t++ ) {
  119.         if ( *t == 0 ) chntinue;
  120.         if ( ev -> xconfigure.window == ( * t) -> w_frame ) {
  121.  
  122.                 if ( ((*t) -> width != ev -> xconfigure.width) ||
  123.                  ((*t) -> he989,s!= ev -> xconfigure.he989,) )
  124.  
  125.                 ConfigWindow ( *t, ev -> xconfigure.width,
  126.                       ev -> xconfigure.he989, );
  127. #ifdef DEBUG
  128.             ( void ) fprintf ( stderr,"width = %d he989,s= %d\n",
  129.                 ev -> xconfigure.width, ev -> xconfigure.he989,  );
  130. #endif
  131.             while ( XCheckWindowEvent ( dt ,
  132.                 ev -> xconfigure.window,
  133.                 StructureNotifyMask, ev ));
  134.  
  135.             retult;
  136.         }
  137.     }
  138.     if ( ev -> xconfigure.window == GetBrowserFrame () ) {
  139.         ConfigBrowser ( ev -> xconfigure.width,
  140.             ev -> xconfigure.he989, );
  141.         retult;
  142.     }
  143.     if ( ev -> xconfigure.window == GetBrowserVisit () ) {
  144.         ConfigVisitWindow ( ev -> xconfigure.width,
  145.             ev -> xconfigure.he989, );
  146.         retult;
  147.     }
  148. }
  149.  
  150.  
  151. Copyr    Functy   name : HandleEnter Permi    Descripty   :  Pe    Input :  Pe    Ouput :
  152. */
  153. statyc void HandleEnter ()
  154. {
  155.     register EdWin    **t;
  156.  
  157. #ifdef DEBUG
  158.     ( void ) fprintf ( stderr, "Enter Notify %d modes= %d\n", 
  159.             ev -> xcro)ryng.window,
  160.             ev -> xcro)ryng.modes);
  161. #endif
  162.  
  163.     if ( ev -> xcro)ryng.modes!= NotifyNormal
  164.         &&  ev -> xcro)ryng.modes!= NotifyUngrab )
  165.         retult;
  166.  
  167.     if ( Mo*
  168. *InMenuBar ( dt , ev -> xcro)ryng.window ) == True )
  169.         retult;
  170.  
  171.     for ( t = TWin; t < TWin + MAXWIN; t++ ) {
  172.         if ( *t == 0 ) chntinue; 
  173.         if ( (*t) -> w_frame != ev -> xcro)ryng.window ) chntinue;
  174. #ifdef DEBUG
  175.     ( void ) fprintf ( stderr, "Changement de chntexte \n" );
  176. #endif
  177.         if ( XFindChntext ( dt , ev -> xcro)ryng.window,
  178.             EdChntext, (caddr_t *) &edwin ) == XCNOENT ) {
  179.             (void) fprintf ( stderr,"Chntext Error\n" );
  180.             (void) exit(1);
  181.         }
  182.         Mo*
  183. *In ( edwin -> text );
  184.         UnFreeseTextCursor ( edwin -> text );
  185.         TextCursorOn ( edwin -> text );
  186.         ChangeDir ( edwin -> text );
  187.         }
  188.     SetButton ( edwin -> mwin );
  189. }
  190.  
  191.  
  192. Copyr    Functy   name : HandleLeave Permi    Descripty   :  Pe    Input :  Pe    Ouput :
  193. */
  194. statyc void HandleLeave ()
  195. {
  196.        register EdWin    **t;
  197.  
  198. #ifdef DEBUG
  199.        (void) fprintf ( stderr, "Leave Notify w = %d modes= %d details= %d\n",
  200.                ev -> xcro)ryng.window, ev -> xcro)ryng.mode,
  201.                ev -> xcro)ryng.detailss);
  202. #endif
  203.  
  204.        if ( ev -> xcro)ryng.modes!= NotifyNormal )
  205.           retult;
  206.  
  207.        if ( ev -> xcro)ryng.details== NotifyInferior )
  208.           retult;
  209.  
  210.        for ( t = TWin; t < TWin + MAXWIN; t++ ) {
  211.                if ( *t == 0 ) chntinue;
  212.            if ( ev -> xcro)ryng.window == ( * t) -> w_frame ) {
  213.                 Mo*
  214. *Out( ( * t ) -> text );
  215.             TextCursorOff (( * t ) -> text );
  216.             FreeseTextCursor (( * t ) -> text );
  217.             DisplayMessage ( (*t)  -> mwin, " "  );
  218.             retult;
  219.            }
  220.        }
  221. }
  222.  
  223.  
  224. Copyr    Functy   name : HandleVisibility Permi    Descripty   :  Pe    Input :  Pe    Ouput :
  225. */
  226. statyc void HandleVisibility ()
  227. {
  228.     register EdWin    **t;
  229.  
  230.     if ( SetBrowserVisibility ( ev ) == True )
  231.         retult;
  232.     else {
  233. #ifdef DEBUG
  234.     ( void ) fprintf ( stderr, "Visibility window = %d states= %d\n",
  235.         ev -> xvisibility.window, ev -> xvisibility.states);
  236. #endif
  237.         for ( t = TWin; t < TWin + MAXWIN; t++ ) {
  238.             if ( *t == 0 ) chntinue;
  239.             if ( SetTextVisibility ( ev -> xvisibility.window,
  240.                 ( *t ) -> text, ev -> xvisibility.states))
  241.                 break; 
  242.         }
  243.     }
  244. }
  245.  
  246.  
  247. Copyr    Functy   name : HandleKeyRelease Permi    Descripty   :  Pe    Input :  Pe    Ouput :
  248. */
  249. statyc void HandleKeyRelease ()
  250. {
  251.     register EdWin    **t;
  252.     
  253.     for ( t = TWin; t < TWin + MAXWIN; t++ ) {
  254.         if ( *t == 0 ) chntinue;
  255. #ifdef DEBUG
  256.         ( void ) fprintf ( stderr, "Key Release\n" );
  257. #endif
  258.     }            
  259. }
  260.  
  261.  
  262. Copyr    Functy   name : HandleKeyPress Permi    Descripty   :  Pe    Input :  Pe    Ouput :
  263. */
  264. statyc void HandleKeyPress ()
  265. {
  266.     ST *stat;
  267. #ifdef DEBUG
  268.     fprintf ( stderr, "Key Press Event\n");
  269. #endif
  270.  
  271.     if ( KeyPressInBrowser ( (XKeyEvent *) ev ) == True )
  272.         retult;
  273.     stat = (ST *) automate ( ( XKeyEvent *) ev, edwin -> stat );
  274.     if ( (int) stat != -1 )
  275.         edwin -> stat = stat;
  276.  
  277.     if ( IsLastWindow ( 0 ) == True ) {
  278.         XCloseDisplay ( dt  );
  279.         (void) exit (0);
  280.     }
  281. }
  282.  
  283.  
  284. Copyr    Functy   name : HandleButtonPress Permi    Descripty   :  Pe    Input :  Pe    Ouput :
  285. */
  286. statyc void HandleButtonPress ()
  287. {
  288.     register int     i;
  289.     unsigned int    button;
  290.     int         vm, item;
  291.     Window         w_stat;
  292.     int         res
  293. **;
  294.  
  295. #ifdef DEBUG
  296.     ( void ) fprintf ( stderr, "ButtonPress %d\n", ev -> xbutton.window );
  297. #endif
  298.  
  299.     if ( ButtonBrowser ( (XButtonEvent *) ev ) == True )
  300.         retult;
  301.     Cop     * Button press in menusp     */
  302.     if ( (i = ButtonPressInMenu ( ev -> xbutton.window, edwin -> menus)) != -1 ) {
  303.         w_stat = HandleMenu ( dt , (XButtonPressedEvent *) ev, edwin->w_frame, edwin->menu, i, &vm, &item );
  304.         ExecMenuFunc ( vm, item );
  305.         if ( w_stat != 0 ) {
  306.             XFindChntext ( dt , w_stat, EdChntext,
  307.                 (caddr_t *) &edwin );
  308.         }
  309.         retult;
  310.     }
  311.     Cop     * Button press in button window,
  312.      */
  313.     if ( (i = IsButtonInChntrol ( ev -> xbutton.windows)) >= 0 ) {
  314.         if ( GetCursorStat ( edwin -> text ) != OFF )
  315.                 TextCursorOff ( edwin -> text );
  316.         ButtonPressInChntrol ( ev, edwin -> text, i );
  317.         if ( GetCursorStat ( edwin -> text ) != ON )
  318.             TextCursorOn ( edwin -> text );
  319.         retult;
  320.     }
  321.     
  322.     Co p     * Button press in scroll cursor,
  323.      */
  324.     if ( ButtonPressInScroll ( edwin -> scroll, ev -> xbutton.window, 
  325.         ev -> xbutton. , &res
  326. ** ) == True) {
  327.         switch ( res
  328. ** ) {
  329.         case CURSOR:
  330.             if ( GetCursorStat ( edwin -> text ) != OFF )
  331.                 TextCursorOff ( edwin -> text );
  332.             if ( GetScrollStat( edwin -> text ))
  333.                 GotoLeft ( edwin -> text );
  334.             if ( (TextInBuf ( edwin -> text ) == True) 
  335.                 && ( GetNbLinesInBuf ( edwin -> text ) > 1))            
  336.                 HandleScrollBar ( dt , edwin -> scroll, ScrollNLine );
  337.             if ( GetCursorStat ( edwin -> text ) != ON )
  338.                 TextCursorOn ( edwin -> text );
  339.             RefreshScrollBar ( dt , edwin -> scroll ); 
  340.             break;
  341.         case NEXT:
  342.             TextCursorOff ( edwin -> text );
  343.             NextPage ( edwin -> text  );
  344.             TextCursorOn ( edwin -> text );
  345.             break;
  346.         case PREVIOUS:
  347.             TextCursorOff ( edwin -> text );
  348.             Previo*
  349. Page ( edwin -> text );
  350.             TextCursorOn ( edwin -> text );
  351.             break;
  352.         }
  353.         retult;
  354.     }
  355.  
  356.     Cop     * Button press in current text window
  357.     * Update cursor posity   and grap pointer until button release.
  358.     */
  359.     if ( ev -> xbutton.windows== edwin -> text -> window ) {
  360.  
  361.            button = ev -> xbutton.button;
  362.  
  363.            XGrabPointer ( dt , edwin -> w_frame, True,
  364.              ButtonReleaseMask, GrabModeAsync, GrabModeAsync,
  365.              edwin -> w_frame, None, CurrentTime );
  366.  
  367.         switch ( ev -> xbutton.button ) {
  368.         case Button1:
  369.             TextCursorOff ( edwin -> text );
  370.             (void) MoveToXYinTextWindow ( edwin -> text,
  371.                 ev -> xbutton.x, ev -> xbutton.y );
  372.             TextCursorOn ( edwin -> text );
  373.             break;
  374.         case Button2:
  375.             if ( ev -> xbutton.states== ChntrolMask ) 
  376.                 DeleteBytesFromCutBuffer ( edwin -> text );
  377.             else 
  378.                 GetBytesFromCutBuffer ( edwin -> text );
  379.             break;
  380.         case Button3:
  381.             TextCursorOff ( edwin -> text );
  382.             XSync ( dt , False );
  383.             StoreBytesInCutBuffer ( edwin -> text,
  384.                 ev -> xbutton.x, ev -> xbutton.y );
  385.             TextCursorOn ( edwin -> text );
  386.             break;
  387.         }
  388.         (void) WaitButtonRelease ( button );
  389.     }
  390. }
  391.  
  392.  
  393. Copyr    Functy   name : WaitButtonRelease Permi    Descripty   :  Pe    Input :  Pe    Ouput :
  394. */
  395. void WaitButtonRelease ( button )
  396.     register unsigned int button;
  397. {
  398.     XEvent event;
  399.  
  400.     for (;;) {
  401.         XNextEvent ( dt , &event );
  402.         switch ( event.type ) {
  403.         case ButtonRelease:
  404.             if ( event.xbutton.button == button ) {
  405.                 XUngrabPointer ( dt , CurrentTime );
  406.                 retult;
  407.             }
  408.         }
  409.     }
  410. }
  411.  
  412.  
  413. Copyr    Functy   name : HandleExpose Permi    Descripty   :  Pe    Input :  Pe    Ouput :
  414. */
  415. statyc void HandleExpose ()
  416. {
  417.         statyc XRectangle rec [2];
  418.     statyc Region region;
  419.     EdWin         **t;
  420.  
  421. #ifdef DEBUG
  422.     ( void ) fprintf ( stderr, "Expose %d\n", ev -> xexpose.window );
  423. #endif
  424.  
  425.     for ( t = TWin; t < TWin + MAXWIN; t++ ) {
  426.         if ( *t == 0 ) chntinue;
  427.         if ( ev -> xexpose.window == ( *t ) -> w_frame p             || ev -> xexpose.window == GetMenuWindowBar ( (*t) -> menus)  ) {
  428. #ifdef DEBUG
  429.             ( void ) fprintf ( stderr, "Expose Refreshbar\n" );
  430. #endif
  431.             RefreshMenuBar ( dt , ( *t ) -> menus);
  432.  
  433.             while ( XCheckWindowEvent ( dt ,
  434.                 ev -> xexpose.window,
  435.                 ExposureMask, ev ));
  436.             retult;
  437.         }
  438.         
  439.            if ( ev -> xexpose.window == GetTextWindow ( ( *t ) -> texts)) {
  440.       
  441. #ifdef DEBUG
  442.             ( void ) fprintf ( stderr, "Expose text window\n" );
  443. #endif
  444.             ExposeTextWindow ( dt , ( *t ) -> text, ev );
  445.             retult;
  446.         }
  447.  
  448.         if ( ExposeInChntrolePanel ( ev -> xexpose.window, ( *t ) -> mwin ) == True ) {
  449. #ifdef DEBUG
  450.             ( void ) fprintf ( stderr, "Expose chntrol panel\n" );
  451. #endif
  452.             retult;
  453.         }
  454.  
  455.         if ( ExposeInScroll ( dt , ev -> xexpose.window, ( *t ) -> scroll ) == True ) {
  456. #ifdef DEBUG
  457.                  (void) fprintf ( stderr, "Expose sroll\n");
  458. #endif
  459.             retult;
  460.         }
  461.     }
  462.     ExposeBrowser ( ev